package com.gosophia.metadataEngine.ws.impl;

import java.util.ArrayList;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.jws.WebService;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.gosophia.commons.OrderCondition;
import com.gosophia.commons.Page;
import com.gosophia.commons.PropertyFilter;
import com.gosophia.commons.exception.BusinessException;
import com.gosophia.metadataEngine.dto.DataSourceInfoDto;
import com.gosophia.metadataEngine.dto.MetaDataFieldDto;
import com.gosophia.metadataEngine.dto.MetaDataTableDto;
import com.gosophia.metadataEngine.entity.DataSourceInfo;
import com.gosophia.metadataEngine.entity.MetaDataField;
import com.gosophia.metadataEngine.entity.MetaDataTable;
import com.gosophia.metadataEngine.service.BusinessDataService;
import com.gosophia.metadataEngine.service.DataSourceInfoService;
import com.gosophia.metadataEngine.service.MetaDataFieldService;
import com.gosophia.metadataEngine.service.MetaDataTableService;
import com.gosophia.metadataEngine.ws.MetadataEngineWebService;
import com.gosophia.metadataEngine.ws.MetadataEngineWebServiceNameSpace;

/**
 * 元数据--MetadataEngineWebServiceImpl实现类
 * 
 * @author tianchunyu
 * @date 2010-9-16
 */
//@WebService(serviceName = "MetadataEngineWebService", endpointInterface = "com.gosophia.metadataEngine.ws.MetadataEngineWebService", targetNamespace = MetadataEngineWebServiceNameSpace.METADATAENGINE_WEBSERVICE_NAMESPACE)
@Service("metadataEngineWebService")
@Transactional
public class MetadataEngineWebServiceImpl implements MetadataEngineWebService {

    @Autowired
    private Mapper dozer;

    @Autowired
    private BusinessDataService businessDataService;

    @Autowired
    private DataSourceInfoService dataSourceInfoService;

    @Autowired
    private MetaDataFieldService metaDataFieldService;

    @Autowired
    private MetaDataTableService metaDataTableService;

    /**
     * 添加数据源信息: dataSourceInfoDto不能为null,name不能为null,
     * driverClass不能为null,dialect不能为null,
     * password不能为null,userName不能为null,url不能为null
     * 
     * @param dataSourceInfoDto
     *            不能为null,dataSourceInfoId必须为null
     * @throws WebServiceException
     *             ,当添加失败时
     */
    @Override
    public void addDataSourceInfo(DataSourceInfoDto dataSourceInfoDto)
            throws BusinessException {

        Assert.isTrue(dataSourceInfoDto != null, "要添加的对象不能为null");
        Assert.isTrue(dataSourceInfoDto.getDataSourceInfoId() == null,
                "要添加的对象不能有Id");
        Assert.notNull(dataSourceInfoDto.getName(), "name不能为null");
        Assert
                .notNull(dataSourceInfoDto.getDriverClass(),
                        "driverClass不能为null");
        Assert.notNull(dataSourceInfoDto.getDialect(), "dialect不能为null");
        Assert.notNull(dataSourceInfoDto.getUrl(), "url不能为null");
        DataSourceInfo dataSourceInfo = dozer.map(dataSourceInfoDto,
                DataSourceInfo.class);
        dataSourceInfoService.addDataSourceInfo(dataSourceInfo);

    }

    /**
     * 将对接表的字段描述添加到字段表中
     * 
     * @param metaDataFieldDtos
     *            不能为null
     * @throws WebServiceException
     *             :当同一个元数据表id下名称，中文名称或属性名称重复时
     */
    @Override
    public void addMetaDataField(List<MetaDataFieldDto> metaDataFieldDtos)
            throws BusinessException {
        Assert.isTrue(metaDataFieldDtos != null, "要添加的对象不能为null");
        List<MetaDataField> metaDataFields = new ArrayList<MetaDataField>();
        for (MetaDataFieldDto metaDataFieldDto : metaDataFieldDtos) {
            Assert.notNull(metaDataFieldDto, "metaDataTable不能为null");
            Assert.notNull(metaDataFieldDto.getMetaDataTableId(),
                    "metaDataTable.id不能为null");
            Assert.isNull(metaDataFieldDto.getMetaDataFieldId(), "id必须为null");
            MetaDataField metaDataField = dozer.map(metaDataFieldDto,
                    MetaDataField.class);
            metaDataField.setMetaDataTable(metaDataTableService
                    .findMetaDataTableById(metaDataFieldDto
                            .getMetaDataTableId()));
            metaDataFields.add(metaDataField);
        }
        metaDataFieldService.addMetaDataField(metaDataFields);
    }

    /**
     * 添加元数据表信息: metaDataTableDto,tableName,tableNameCN,entityClassName不能为null，
     * metaDataTableId必须为null, dataSourceInfoId不能为null
     * 
     * @param metaDataTableDto
     *            元数据表
     */
    @Override
    public void addMetaDataTable(MetaDataTableDto metaDataTableDto)
            throws BusinessException {

        Assert.isTrue(metaDataTableDto != null, "要添加的对象不能为null");
        Assert.isTrue(metaDataTableDto.getMetaDataTableId() == null,
                "要添加的对象不能有id");
        Assert.notNull(metaDataTableDto.getTableName(), "tableName不能为null");
        Assert.notNull(metaDataTableDto.getTableNameCN(), "tableNameCN不能为null");
        Assert.notNull(metaDataTableDto.getEntityClassName(),
                "entityClassName不能为null");
        Assert.notNull(metaDataTableDto.getDataSourceInfoId(),
                "dataSourceInfoId不能为null");
        MetaDataTable metaDataTable = dozer.map(metaDataTableDto,
                MetaDataTable.class);
        metaDataTable
                .setDataSourceInfo(dataSourceInfoService
                        .findDataSourceInfoById(metaDataTableDto
                                .getDataSourceInfoId()));
        metaDataTableService.addMetaDataTable(metaDataTable);

    }

    /**
     * 分页查询所有数据源信息
     * 
     * @param pageSize
     *            必须为正整数
     * @param pageNo
     *            必须为正整数
     * @param searchString
     * @return 分页查询的所有数据源信息
     */
    @Override
    public Page<DataSourceInfoDto> findAllDataSourceInfoByPage(int pageSize,
            int pageNo,String searchString,List<OrderCondition> orderConditions) {

        Page<DataSourceInfoDto> pageDto = new Page<DataSourceInfoDto>();
        Assert.isTrue(pageSize > 0, "分页信息中pageSize必须为正整数");
        Assert.isTrue(pageNo > 0, "分页信息中pageNo必须为正整数");
        List<DataSourceInfoDto> dataSourceInfoDtos = new ArrayList<DataSourceInfoDto>();
        Page<DataSourceInfo> page = new Page<DataSourceInfo>();
        page.setPageNo(pageNo);
        page.setPageSize(pageSize);
        page = dataSourceInfoService
                .findAllDataSourceInfoByPage(page,searchString,orderConditions);
        for (DataSourceInfo dataSourceInfo : page.getResult()) {
            DataSourceInfoDto dataSourceInfoDto = dozer.map(dataSourceInfo,
                    DataSourceInfoDto.class);
            dataSourceInfoDtos.add(dataSourceInfoDto);
        }
        pageDto.setPageNo(pageNo);
        pageDto.setPageSize(pageSize);
        pageDto.setTotalCount(page.getTotalCount());
        pageDto.setResult(dataSourceInfoDtos);
        return pageDto;
    }

    /**
     * 分页查询所有元数据表中记录
     * 
     * @param pageSize
     * @param pageNo
     * @return 分页查询的所有元数据表中记录
     */
    @Override
    public Page<MetaDataTableDto> findAllMetaDataTableByPage(int pageSize,
            int pageNo) {
        Page<MetaDataTableDto> pageDto = new Page<MetaDataTableDto>();
        Assert.isTrue(pageSize > 0, "分页信息中pageSize必须为正整数");
        Assert.isTrue(pageNo > 0, "分页信息中pageNo必须为正整数");
        List<MetaDataTableDto> metaDataTableDtos = new ArrayList<MetaDataTableDto>();
        Page<MetaDataTable> page = metaDataTableService
                .findAllMetaDataTableByPage(pageSize, pageNo);
        for (MetaDataTable metaDataTable : page.getResult()) {
            MetaDataTableDto metaDataTableDto = dozer.map(metaDataTable,
                    MetaDataTableDto.class);
            metaDataTableDto.setDataSourceInfoId(metaDataTable
                    .getDataSourceInfo().getDataSourceInfoId());
            metaDataTableDtos.add(metaDataTableDto);
        }
        pageDto.setPageNo(pageNo);
        pageDto.setPageSize(pageSize);
        pageDto.setTotalCount(page.getTotalCount());
        pageDto.setResult(metaDataTableDtos);

        return pageDto;
    }

    /**
     * 根据dataSrouceInfoId查询数据源信息
     * 
     * @param dataSourceInfoId
     *            不能为null
     * @return 根据dataSrouceInfoId查询数据源
     */
    @Override
    public DataSourceInfoDto findDataSourceInfoById(Long dataSourceInfoId) {
        DataSourceInfoDto dataSourceInfoDto;
        Assert.isTrue(dataSourceInfoId != null, "用来查询的Id不能为null");
        DataSourceInfo dataSourceInfo = dataSourceInfoService
                .findDataSourceInfoById(dataSourceInfoId);
        dataSourceInfoDto = dozer.map(dataSourceInfo, DataSourceInfoDto.class);

        return dataSourceInfoDto;
    }

    /**
     * 根据元数据中元数据表id查询该表所有的元数据字段（查询元数据字段表）
     * 
     * @param tableId
     *            元数据系统表编号,不能为null
     * @return 元数据字段
     */
    @Override
    public List<MetaDataFieldDto> findMetaDataFieldByTableId(Long tableId) {
        List<MetaDataFieldDto> metaDataFieldDtos = new ArrayList<MetaDataFieldDto>();
        Assert.isTrue(tableId != null, "用来查询的id不能为null");
        List<MetaDataField> metaDataFields = metaDataFieldService
                .findMetaDataFieldByTableId(tableId);
        for (MetaDataField metaDataField : metaDataFields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(tableId);
            metaDataFieldDtos.add(metaDataFieldDto);
        }
        return metaDataFieldDtos;
    }

    /**
     * 显示指定系统下详细页面应显示的字段（包括hidden字段）
     * 
     * @param tableId
     *            不能为null
     * @return 元数据字段列表
     */
    @Override
    public List<MetaDataFieldDto> findMetaDataFieldByTableIdDetailShow(
            Long tableId) {
        List<MetaDataFieldDto> metaDataFieldDtos = new ArrayList<MetaDataFieldDto>();
        Assert.isTrue(tableId != null, "用来查询的表Id不能为null");
        List<MetaDataField> metaDataFields = metaDataFieldService
                .findMetaDataFieldByTableIdDetailShow(tableId);
        for (MetaDataField metaDataField : metaDataFields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(tableId);
            metaDataFieldDtos.add(metaDataFieldDto);
        }

        return metaDataFieldDtos;
    }

    /**
     * 显示指定系统下列表页面应显示的字段（包括hidden字段）
     * 
     * @param tableId
     * @return 元数据字段列表
     */
    @Override
    public List<MetaDataFieldDto> findMetaDataFieldByTableIdListShow(
            Long tableId) {
        List<MetaDataFieldDto> metaDataFieldDtos = new ArrayList<MetaDataFieldDto>();
        Assert.isTrue(tableId != null, "用来查询的表id不能为null");
        List<MetaDataField> metaDataFields = metaDataFieldService
                .findMetaDataFieldByTableIdListShow(tableId);
        for (MetaDataField metaDataField : metaDataFields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(tableId);
            metaDataFieldDtos.add(metaDataFieldDto);
        }

        return metaDataFieldDtos;
    }

    /**
     * 根据元数据表id查询: metaDataTableId不能为null
     * 
     * @param metaDataTableId
     *            不能为null
     * @return 元数据表
     */
    @Override
    public MetaDataTableDto findMetaDataTableById(Long metaDataTableId) {
        MetaDataTableDto metaDataTableDto;
        Assert.isTrue(metaDataTableId != null, "用来查询的表id不能为null");
        MetaDataTable metaDataTable = metaDataTableService
                .findMetaDataTableById(metaDataTableId);
        metaDataTableDto = dozer.map(metaDataTable, MetaDataTableDto.class);
        metaDataTableDto.setDataSourceInfoId(metaDataTable.getDataSourceInfo()
                .getDataSourceInfoId());

        return metaDataTableDto;
    }

    /***
     * 根据系统数据编号，查询该系统数据的详细页面显示信息
     * 
     * @param id
     *            不能为null
     * @return 根据系统数据编号，查询该系统数据的详细页面显示信息
     */
    @Override
    public Map<String, Object> findSystemDataDetail(Long id,
            Long metaDataTableId) {
        Map<String, Object> map;
        Assert.isTrue(id != null, "id不能为null");
        Assert.isTrue(metaDataTableId != null, "metaDataTableId不能为null");
        map = (HashMap) businessDataService.findSystemDataDetail(id,
                metaDataTableId);

        return map;
    }

    @Override
    public Page<Map<String, Object>> findSystemDataSimpleByPage(Long metaDataTableId,Page<Map<String, Object>> page,
    		         String searchString,List<OrderCondition> orderConditions,List<PropertyFilter> propertyFilters) {
    	Assert.notNull(page,"page对象不能为null");
        Assert.isTrue(page.getPageSize() > 0, "分页信息中pageSize必须为正整数");
        Assert.isTrue(page.getPageNo() > 0, "分页信息中pageNo必须为正整数");
        Assert.isTrue(metaDataTableId != null, "用来查询的表Id不能为null");
        return businessDataService.findSystemDataSimpleByPage(metaDataTableId, page, searchString, orderConditions, propertyFilters);
    }
    
    @Override
	public Page<Map<String, Object>> findSystemDataAdvanceByPage(
			Long metaDataTableId, List<PropertyFilter> propertyFilters,
			Page<Map<String, Object>> page, List<OrderCondition> orderConditions) {
    	Assert.notNull(page,"page对象不能为null");
        Assert.isTrue(page.getPageSize() > 0, "分页信息中pageSize必须为正整数");
        Assert.isTrue(page.getPageNo() > 0, "分页信息中pageNo必须为正整数");
        Assert.isTrue(metaDataTableId != null, "用来查询的表Id不能为null");
		return businessDataService.findSystemDataAdvanceByPage(metaDataTableId, propertyFilters, page, orderConditions);
	}

    /**
     * 根据元数据中系统表id查询该系统表下所有字段（根据配置到元数据表中的id查询接入到系统中的表的字段信息）
     * 
     * @param tableId
     *            系统表id 不能为null
     * @return 系统表下所有字段
     * @throws BusinessException 
     * @throws BusinessException 
     */
    @Override
    public List<MetaDataFieldDto> findSystemFieldByTableId(Long tableId) throws BusinessException{
        List<MetaDataFieldDto> metaDataFieldDtos = new ArrayList<MetaDataFieldDto>();
        Assert.isTrue(tableId != null, "用来查询的表id不能为null");
        List<MetaDataField> metaDataFields = metaDataFieldService
                .findSystemFieldByTableId(tableId);
        for (MetaDataField metaDataField : metaDataFields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(tableId);
            metaDataFieldDtos.add(metaDataFieldDto);
        }

        return metaDataFieldDtos;
    }

    @Override
    public DataSourceInfoDto removeDataSourceInfo(Long id, Long version)
            throws BusinessException {
        Assert.isTrue(id != null, "用来查询的id不能为null");
        Assert.isTrue(version != null, "控制版本不能为null");
        DataSourceInfo dataSourceInfo =dataSourceInfoService.removeDataSourceInfo(id, version);
        DataSourceInfoDto deleteDataSourceInfo = dozer.map(dataSourceInfo, DataSourceInfoDto.class);
        return deleteDataSourceInfo;
    }

    /**
     * 删除指定metaDataFieldDto
     * 
     * @param metaDataFieldId
     *            不能为null
     * @param version
     *            不能为null
     */
    @Override
    public void removeMetaDataField(Long metaDataFieldId, Long version){
        Assert.isTrue(metaDataFieldId != null, "用来查询的id不能为null");
        Assert.isTrue(version != null, "控制版本不能为null");
        metaDataFieldService.removeMetaDataField(metaDataFieldId, version);

    }

    /**
     * 删除元数据表信息: metaDataTableId,version 不能为null
     * 
     * @param metaDataTableId
     * @param version
     */
    @Override
    public MetaDataTableDto removeMetaDataTable(Long metaDataTableId, Long version)
            throws BusinessException {
        Assert.isTrue(metaDataTableId != null, "用来查询的id不能为null");
        Assert.isTrue(version != null, "控制版本不能为null");
        MetaDataTable metaDataTable = metaDataTableService.removeMetaDataTable(metaDataTableId, version);
        MetaDataTableDto metaDataTableDto = dozer.map(metaDataTable, MetaDataTableDto.class);
        return metaDataTableDto;

    }

    /**
     * 修改数据源信息
     * 
     * @param dataSourceInfoDto
     *            不能为null，dataSourceInfoDtoId不能为null
     * @throws BusinessException
     */
    @Override
    public void updateDataSourceInfo(DataSourceInfoDto dataSourceInfoDto)
            throws BusinessException {
        Assert.isTrue(dataSourceInfoDto != null, "要更新的对象不能为null");
        Assert.isTrue(dataSourceInfoDto.getDataSourceInfoId() != null,
                "要更新的对象Id不能为null");
        DataSourceInfo dataSourceInfo = dozer.map(dataSourceInfoDto,
                DataSourceInfo.class);
        dataSourceInfoService.updateDataSourceInfo(dataSourceInfo);

    }

    /**
     * 修改
     * 
     * @param metaDataFieldDto不能为null
     *            ，metaDataFieldDto.id不能为null
     * @throws BusinessException修改失败时
     */
    @Override
    public void updateMetaDataField(MetaDataFieldDto metaDataFieldDto)
            throws BusinessException {
        Assert.isTrue(metaDataFieldDto != null, "要更新的对象不能为null");
        Assert.isTrue(metaDataFieldDto.getMetaDataFieldId() != null,
                "要更新的对象的Id不能为null");
        MetaDataField metaDataField = dozer.map(metaDataFieldDto,
                MetaDataField.class);
        metaDataField.setMetaDataTable(metaDataTableService
                .findMetaDataTableById(metaDataFieldDto.getMetaDataTableId()));
        metaDataFieldService.updateMetaDataField(metaDataField);

    }

    /**
     * 修改元数据表信息: metaDataTableDto,tableName,tableNameCN,entityClassName不能为null
     * 
     * @param metaDataTable
     * @throws BusinessException
     */
    public void updateMetaDataTable(MetaDataTableDto metaDataTableDto)
            throws BusinessException {
        Assert.isTrue(metaDataTableDto != null, "要修改的对象不能为null");
        Assert.isTrue(metaDataTableDto.getDataSourceInfoId() != null,
                "要修改的对象id不能为null");
        MetaDataTable metaDataTable = dozer.map(metaDataTableDto,
                MetaDataTable.class);
        metaDataTable
                .setDataSourceInfo(dataSourceInfoService
                        .findDataSourceInfoById(metaDataTableDto
                                .getDataSourceInfoId()));
        metaDataTableService.updateMetaDataTable(metaDataTable);

    }

	@Override
	public void initMetadataSessionFactories() {
       businessDataService.initMetadataSessionFactories();
	}

	@Override
	public Page<MetaDataTableDto> findMetadataTablePageByDataSourceInfoId(
			Long dataSourceInfoId, Page<MetaDataTableDto> page,
			String searchString, List<OrderCondition> orderConditions) {
		Assert.notNull(dataSourceInfoId,"dataSourceInfoId不能为null");
		Assert.notNull(page,"page不能为null");
        Assert.isTrue(page.getPageSize()>0, "pageSize必须大于0");
        Assert.isTrue(page.getPageNo()>0,"pageNo必须大于0");
        Page<MetaDataTable> pageEntity = new Page<MetaDataTable>();
        pageEntity.setPageNo(page.getPageNo());
        pageEntity.setPageSize(page.getPageSize());
        pageEntity = metaDataTableService.findMetadataTablePageByDataSourceInfoId(
    			dataSourceInfoId, pageEntity,searchString, orderConditions);
        List<MetaDataTableDto> metaDataTableDtos = new ArrayList<MetaDataTableDto>();
        for (MetaDataTable metaDataTable : pageEntity.getResult()) {
            MetaDataTableDto metaDataTableDto = dozer.map(metaDataTable,
                    MetaDataTableDto.class);
            metaDataTableDto.setDataSourceInfoId(metaDataTable
                    .getDataSourceInfo().getDataSourceInfoId());
            metaDataTableDtos.add(metaDataTableDto);
        }
        page.setPageNo(pageEntity.getPageNo());
        page.setPageSize(pageEntity.getPageSize());
        page.setTotalCount(pageEntity.getTotalCount());
        page.setResult(metaDataTableDtos);
		return page;
	}

	@Override
	public boolean checkDataSourceInfo(DataSourceInfoDto dataSourceInfoDto) {
		Assert.notNull(dataSourceInfoDto,"dataSourceInfoDto不能为null");
		Assert.notNull(dataSourceInfoDto.getDialect(),"dataSourceInfoDto.dialect不能为null");
		Assert.notNull(dataSourceInfoDto.getDriverClass(),"dataSourceInfoDto.driverClass不能为null");
		Assert.notNull(dataSourceInfoDto.getPassword(),"dataSourceInfoDto.password不能为null");
		Assert.notNull(dataSourceInfoDto.getUsername(),"dataSourceInfoDto.userName不能为null");
		Assert.notNull(dataSourceInfoDto.getUrl(),"dataSourceInfoDto.url不能为null");
		DataSourceInfo dataSourceInfo = new DataSourceInfo();
		dataSourceInfo.setDialect(dataSourceInfoDto.getDialect());
		dataSourceInfo.setUrl(dataSourceInfoDto.getUrl());
		dataSourceInfo.setUsername(dataSourceInfoDto.getUsername());
		dataSourceInfo.setPassword(dataSourceInfoDto.getPassword());
		dataSourceInfo.setDriverClass(dataSourceInfoDto.getDriverClass());
		return dataSourceInfoService.checkDataSourceInfo(dataSourceInfo);
	}

	@Override
	public List<MetaDataFieldDto> findShowTitleItemsByTableId(
			Long metaDataTableId) {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		List<MetaDataFieldDto> dtos = new ArrayList<MetaDataFieldDto>();
		List<MetaDataField> fields = metaDataFieldService.findShowTitleItemsByTableId(metaDataTableId);
		for (MetaDataField metaDataField : fields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(metaDataTableId);
            dtos.add(metaDataFieldDto);
        }
		return dtos;
	}

	@Override
	public String findPrimaryKeyName(Long metaDataTableId) {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		return metaDataFieldService.findPrimaryKeyName(metaDataTableId);
	}

	@Override
	public List<MetaDataFieldDto> findDetailShowItemsByTableId(
			Long metaDataTableId) {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		List<MetaDataFieldDto> dtos = new ArrayList<MetaDataFieldDto>();
		List<MetaDataField> fields = metaDataFieldService.findDetailShowItemsByTableId(metaDataTableId);
		for (MetaDataField metaDataField : fields) {
            MetaDataFieldDto metaDataFieldDto = dozer.map(metaDataField,
                    MetaDataFieldDto.class);
            metaDataFieldDto.setMetaDataTableId(metaDataTableId);
            dtos.add(metaDataFieldDto);
        }
		return dtos;
	}

	@Override
	public List<List<Object>> findRefValues(Long metaDataTableId, Long metaDataFieldId) throws BusinessException {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		Assert.notNull(metaDataFieldId,"metaDataFieldId不能为null");
		List<List<Object>> values = businessDataService.findRefValues(metaDataTableId, metaDataFieldId);
		return values;
	}

	@Override
	public MetaDataFieldDto findMetaDataFieldByDataFieldId(Long metaDataFieldId) {
		Assert.notNull(metaDataFieldId,"metaDataFieldId不能为null");
		MetaDataField field = metaDataFieldService.findMetaDataFieldByDataFieldId(metaDataFieldId);
		MetaDataFieldDto dto = new MetaDataFieldDto();
		dto = dozer.map(field,MetaDataFieldDto.class);
		dto.setMetaDataTableId(field.getMetaDataTable().getMetaDataTableId());
		return dto;
	}

	@Override
	public void updateMetaDataFields(Long metaDataTableId,
			List<MetaDataFieldDto> metaDataFieldDtos) throws BusinessException {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		for(MetaDataFieldDto dto : metaDataFieldDtos){
			dto.setMetaDataTableId(metaDataTableId);
			this.updateMetaDataField(dto);
		}
	}

	@Override
	public void addSystemData(Long metaDataTableId, Map<String, Object> values)
			throws BusinessException {
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		businessDataService.addSystemData(metaDataTableId, values);
	}

	@Override
	public void deleteSystemDataById(Long dataId, Long metaDataTableId)
			throws BusinessException {
		Assert.notNull(dataId,"业务数据ID不能为null");
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		businessDataService.deleteSystemDataById(dataId, metaDataTableId);
	}

	@Override
	public void updateSystemData(Long dataId, Long metaDataTableId,
			Map<String, Object> values) throws BusinessException {
		Assert.notNull(dataId,"业务数据ID不能为null");
		Assert.notNull(metaDataTableId,"metaDataTableId不能为null");
		businessDataService.updateSystemData(dataId, metaDataTableId, values);
	}
}

// /:~
